package android.pot.com.smartcar.map;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.net.Uri;
import android.pot.com.smartcar.R;
import android.pot.com.smartcar.tool.TipToast;
import android.pot.com.smartcar.widget.ActionSheetDialog;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;

import com.baidu.mapapi.model.LatLng;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Viker on 2017/10/16.
 */
public class MapRouteUtil {

    public static String GAODE_MAP = "com.autonavi.minimap";
    public static String BAIDU_MAP = "com.baidu.BaiduMap";
    public static String TENXUN_MAP = "com.tencent.map";
    public static String GOOGLE_MAP = "com.google.android.apps.maps";
    private static List<String> installedAppsName;
    private static List<String> installedAppList;

    public static void routeByWalk(int index, Context context, String distinName, LatLng latLng) {

        String packageName = installedAppList.get(index);
        switch (packageName) {
            case "com.autonavi.minimap":
                toGaoDeByWalk(context, distinName, latLng.latitude, latLng.longitude);
                break;
            case "com.baidu.BaiduMap":
                toBaiDuByWalk(context, "latlng:" + latLng.latitude + "," + latLng.longitude + "|name:" + distinName);
                break;
            case "com.tencent.map":
                toTenCentByWalk(context, null, null, distinName, latLng.latitude + "," + latLng.longitude);
                break;
            default:
                break;
        }
    }

    public static void routeByDrive(int index, Context context, String distinName, LatLng latLng) {

        String packageName = installedAppList.get(index);
        switch (packageName) {
            case "com.autonavi.minimap":
                LatLng mLatlng = BD2GCJ(latLng);
                toGaoDeByDrive(context, distinName, mLatlng.latitude, mLatlng.longitude);
                break;
            case "com.baidu.BaiduMap":
                //latlng:39.9761,116.3282|name:中关村
                LatLng mLatlngss = BD2GCJ(latLng);
                toBaiDuByDrive(context, "latlng:" + mLatlngss.latitude + "," + mLatlngss.longitude + "|name:" + distinName);
                break;
            case "com.tencent.map":
                LatLng mLatlngs = BD2GCJ(latLng);
                toTenCentByDrive(context, null, null, distinName, mLatlngs.latitude + "," + mLatlngs.longitude);
                break;
            default:
                break;
        }
    }

    /**
     * BD-09 坐标转换成 GCJ-02 坐标
     */
    public static LatLng BD2GCJ(LatLng bd) {
        double x = bd.longitude - 0.0065, y = bd.latitude - 0.006;
        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * Math.PI);
        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * Math.PI);

        double lng = z * Math.cos(theta);//lng
        double lat = z * Math.sin(theta);//lat
        return new LatLng(lat, lng);
    }



    /**
     * 获取已安装地图的列表
     *
     * @param context
     * @return
     */
    public static List<String> getInstalledMapApps(Context context) {
        if (installedAppsName != null)
            return installedAppsName;


        installedAppList = new ArrayList<>();
        installedAppsName = new ArrayList<>();


        if (isInstalled(context, GAODE_MAP)) {
            installedAppsName.add("高德地图");
            installedAppList.add(GAODE_MAP);
        }

        if (isInstalled(context, BAIDU_MAP)) {
            installedAppsName.add("百度地图");
            installedAppList.add(BAIDU_MAP);
        }

        if (isInstalled(context, TENXUN_MAP)) {
            installedAppsName.add("腾讯地图");
            installedAppList.add(TENXUN_MAP);
        }

/*        if (AppUtils.isInstalled(context, GOOGLE_MAP)) {
            installedApps.put(GOOGLE_MAP, "谷歌地图");
        }*/
        return installedAppsName;
    }


    public static boolean isInstalled(Context context, String packageName) {
        boolean installed = false;
        if (TextUtils.isEmpty(packageName)) {
            return false;
        }
        List<ApplicationInfo> installedApplications = context.getPackageManager().getInstalledApplications(0);
        for (ApplicationInfo in : installedApplications) {
            if (packageName.equals(in.packageName)) {
                installed = true;
                break;
            } else {
                installed = false;
            }
        }
        return installed;
    }



    public static void toGaoDeByWalk(Context context, String dName, double lat, double lon) {
        toGaoDeRoute(context, context.getString(R.string.app_name)
                , null, null, null, null
                , null, lat + "", lon + "", dName
                , "0", "2");
    }

    public static void toGaoDeByDrive(Context context, String dName, double lat, double lon) {
        toGaoDeRoute(context, context.getString(R.string.app_name)
                , null, null, null, null
                , null, lat + "", lon + "", dName
                , "0", "0");
    }


    /**
     * 启动高德App进行路线规划导航 http://lbs.amap.com/api/amap-mobile/guide/android/route
     *
     * @param context
     * @param sourceApplication 必填 第三方调用应用名称。如 "appName"
     * @param sid
     * @param sla
     * @param slon
     * @param sname
     * @param did
     * @param dlat
     * @param dlon
     * @param dName
     * @param dev               起终点是否偏移(0:lat 和 lon 是已经加密后的,不需要国测加密; 1:需要国测加密)
     * @param t                 t = 0（驾车）= 1（公交）= 2（步行）= 3（骑行）= 4（火车）= 5（长途客车）
     *                          （骑行仅在V788以上版本支持）
     */
    public static void toGaoDeRoute(Context context, String sourceApplication
            , String sid, String sla, String slon, String sname
            , String did, String dlat, String dlon, String dName
            , String dev, String t) {
        StringBuffer stringBuffer = new StringBuffer("androidamap://route/plan?sourceApplication=").append(sourceApplication);
        if (!TextUtils.isEmpty(sid)) {
            stringBuffer.append("&sid=").append(sid);
        }
        if (!TextUtils.isEmpty(sla)) {
            stringBuffer.append("&sla=").append(sla);
        }
        if (!TextUtils.isEmpty(sla)) {
            stringBuffer.append("&sla=").append(sla);
        }
        if (!TextUtils.isEmpty(slon)) {
            stringBuffer.append("&slon=").append(slon);
        }
        if (!TextUtils.isEmpty(sname)) {
            stringBuffer.append("&sname=").append(sname);
        }
        if (!TextUtils.isEmpty(did)) {
            stringBuffer.append("&did=").append(did);
        }
        stringBuffer.append("&dlat=").append(dlat);
        stringBuffer.append("&dlon=").append(dlon);
        stringBuffer.append("&dName=").append(dName);
        stringBuffer.append("&dev=").append(dev);
        stringBuffer.append("&t=").append(t);


        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);

        //将功能Scheme以URI的方式传入data
        Uri uri = Uri.parse(stringBuffer.toString());
        intent.setData(uri);
        context.startActivity(intent);
    }

    /**
     * 百度路线规划 URL接口：baidumap://map/direction
     *
     * @param context
     * @param origin             起点名称或经纬度，或者可同时提供名称和经纬度，此时经纬度优先级高，将作为导航依据，名称只负责展示
     *                           origin和destination二者至少一个有值（默认值是当前定位地址）
     *                           经纬度: 39.9761,116.3282
     *                           经纬度和名称:
     *                           latlng:39.9761,116.3282|name:中关村 (注意：坐标先纬度，后经度)
     * @param destination        终点名称或经纬度，或者可同时提供名称和经纬度，此时经纬度优先级高，将作为导航依据，名称只负责展示。
     * @param mode               导航模式，可选transit（公交）、driving（驾车）、walking（步行）和riding（骑行）.默认:driving
     * @param region             城市名或县名
     * @param origin_region      起点所在城市或县
     * @param destination_region 终点所在城市或县
     * @param sy                 公交检索策略，只针对mode字段填写transit情况下有效，值为数字。
     *                           0：推荐路线
     *                           2：少换乘
     *                           3：少步行
     *                           4：不坐地铁
     *                           5：时间短
     *                           6：地铁优先
     * @param index              公交结果结果项，只针对公交检索，值为数字，从0开始
     * @param target             0 图区，1 详情，只针对公交检索有效
     * @param coord_type         坐标类型，可选参数，默认为bd09经纬度坐标。
     *                           允许的值为bd09ll、bd09mc、gcj02、wgs84。
     *                           bd09ll表示百度经纬度坐标，
     *                           bd09mc表示百度墨卡托坐标，
     *                           gcj02表示经过国测局加密的坐标，
     *                           wgs84表示gps获取的坐标
     */
    private static void toBaiDuDirection(Context context, String origin, String destination, String mode
            , String region, String origin_region, String destination_region
            , String sy, String index, String target, String coord_type) {

        StringBuffer sb = new StringBuffer("baidumap://map/direction?mode=").append(mode);

        boolean isHasOrigin = false;
        boolean isHasdestination = false;
        if (!TextUtils.isEmpty(origin)) {
            isHasOrigin = true;
            sb.append("&origin=" + origin);
        }
        if (!TextUtils.isEmpty(destination)) {
            isHasdestination = true;
            sb.append("&destination=" + destination);
        }

        if (!isHasOrigin && !isHasdestination) {
            TipToast.show("请输入起点或目的地");
            return;
        }

        if (!TextUtils.isEmpty(region)) {
            sb.append("&region=" + region);
        }
        if (!TextUtils.isEmpty(origin_region)) {
            sb.append("&origin_region=" + origin_region);
        }
        if (!TextUtils.isEmpty(destination_region)) {
            sb.append("&destination_region=" + destination_region);
        }
        if (!TextUtils.isEmpty(sy)) {
            sb.append("&sy=" + sy);
        }
        if (!TextUtils.isEmpty(index)) {
            sb.append("&index=" + index);
        }
        if (!TextUtils.isEmpty(target)) {
            sb.append("&target=" + target);
        }
        if (!TextUtils.isEmpty(coord_type)) {
            sb.append("&coord_type=" + coord_type);
        }


        Intent i1 = new Intent();
        i1.setData(Uri.parse(sb.toString()));
        context.startActivity(i1);
    }

    /**
     * @param context
     * @param destination latlng:39.9761,116.3282|name:中关村
     */
    public static void toBaiDuByWalk(Context context, String destination) {
        toBaiDuNavi(context, destination, "walking");
    }

    /**
     * @param context
     * @param destination latlng:39.9761,116.3282|name:中关村
     */
    public static void toBaiDuByDrive(Context context, String destination) {
        toBaiDuNavi(context, destination, "driving");
    }

    /**
     * 百度导航
     *
     * @param destination 经纬度: 39.9761,116.3282
     *                    经纬度和名称:
     *                    latlng:39.9761,116.3282|name:中关村 (注意：坐标先纬度，后经度)
     * @param mode        导航模式，
     *                    可选transit（公交）、
     *                    driving（驾车）、
     *                    walking（步行）和riding（骑行）.
     *                    默认:driving
     */
    public static void toBaiDuNavi(Context context, String destination, String mode) {
        if (TextUtils.isEmpty(mode)) {
            mode = "driving";
        }
        //  高德坐标类型：gcj02ll
        toBaiDuDirection(context, "", destination, mode, "", null, null, null, null, null, "gcj02");
    }

    public static void toTenCentByWalk(Context context, String fromName, String fromcoord, String toName, String tocoord) {
        toTenCent(context, "walk", fromName, fromcoord, toName, tocoord);
    }

    public static void toTenCentByDrive(Context context, String fromName, String fromcoord, String toName, String tocoord) {
        toTenCent(context, "drive", fromName, fromcoord, toName, tocoord);
    }

    /**
     * @param context
     * @param type      公交：bus
     *                  驾车：drive
     *                  步行：walk（仅适用移动端）
     * @param fromName
     * @param fromcoord fromcoord=39.873145,116.413306
     * @param toName
     * @param tocoord
     */
    public static void toTenCent(Context context, String type, String fromName, String fromcoord, String toName, String tocoord) {
        StringBuffer fromTo = new StringBuffer("qqmap://map/routeplan?type=");

        if (TextUtils.isEmpty(type))
            type = "drive";
        fromTo.append(type);

        if (!TextUtils.isEmpty(fromName))
            fromTo.append("&from=" + fromName);

        if (!TextUtils.isEmpty(fromcoord))
            fromTo.append("&fromcoord=" + fromcoord);

        if (!TextUtils.isEmpty(toName))
            fromTo.append("&to=" + toName);
        if (!TextUtils.isEmpty(tocoord))
            fromTo.append("&tocoord=" + tocoord);

        toTenCentNavi(context, fromTo.toString());

    }

    /**
     * http://lbs.qq.com/uri_v1/guide.html
     *
     * @param context
     * @param s
     */
    private static void toTenCentNavi(Context context, String s) {

        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);

        //将功能Scheme以URI的方式传入data
        intent.setData(Uri.parse(s));
        context.startActivity(intent);
    }

    /**
     * @param context
     * @param type    公交：bus
     *                驾车：drive
     *                步行：walk（仅适用移动端）
     * @param from
     * @param to
     */
    public static void toTenCentNavi(Context context, String type, String from, String to) {
        StringBuffer sb = new StringBuffer("qqmap://map/routeplan?type=drive").append(type);

        if (!TextUtils.isEmpty(from))
            sb.append(from);
        if (!TextUtils.isEmpty(to))
            sb.append(to);

        Uri uri = Uri.parse("qqmap://map/routeplan?type=drive&to=国家大剧院&tocoord=39.907380,116.388501");

        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);

        //将功能Scheme以URI的方式传入data
        intent.setData(uri);
        context.startActivity(intent);

    }

    public static void showMapByWalkDialog(final Context context, final String dName, final LatLng latLng) {
        getInstalledMapApps(context);

        if (installedAppsName==null || installedAppsName.isEmpty()){
            TipToast.show("没有可用的地图可供导航");
            return;
        }

        String[] items = (String[]) installedAppsName.toArray(new String[installedAppsName.size()]);

        AlertDialog.Builder listDialog =
                new AlertDialog.Builder(context);
        listDialog.setItems(items, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // which 下标从0开始
                routeByWalk(which, context, dName, latLng);
            }
        });
        listDialog.show();

    }
    public static void showMapByDriveDialog(final Context context, final String dName, final LatLng latLng) {
        getInstalledMapApps(context);
        String[] items = (String[]) installedAppsName.toArray(new String[installedAppsName.size()]);

        if (items.length == 0){
            TipToast.show("没有可用地图");
            return;
        }
        ActionSheetDialog dialog = new ActionSheetDialog(context)
                .builder()
                .setTitle("选择您要使用的地图")
                .setCancelable(true)
                .setCanceledOnTouchOutside(true);
        for (String model : items) {
            dialog.addSheetItem(model, ActionSheetDialog.SheetItemColor.Red
                    , new ActionSheetDialog.OnSheetItemClickListener() {
                        @Override
                        public void onClick(int po) {
                            routeByDrive(po-1, context, dName, latLng);
                        }
                    });
        }
        dialog.show();


//        AlertDialog.Builder listDialog =
//                new AlertDialog.Builder(context);
//        listDialog.setItems(items, new DialogInterface.OnClickListener() {
//            @Override
//            public void onClick(DialogInterface dialog, int which) {
//                // which 下标从0开始
//                routeByDrive(which, context, dName, latLng);
//            }
//        });
//        listDialog.show();

    }

    /**
     *
     * @param context
     * @param dName
     * @param latLng
     * @param type 0:开车规划；1：步行规划
     */
    public static void showMapNaviDialog(final Context context, final String dName, final LatLng latLng, final int type){
        getInstalledMapApps(context);
        String[] items = (String[]) installedAppsName.toArray(new String[installedAppsName.size()]);

        AlertDialog.Builder listDialog =
                new AlertDialog.Builder(context);
        listDialog.setItems(items, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // which 下标从0开始
                if (type==0){
                    routeByDrive(which, context, dName, latLng);
                }else {
                    routeByWalk(which, context, dName, latLng);
                }
            }
        });
        listDialog.show();
    }


}
